home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
-
- #include "MemoryCalls.h"
- #include "Serial.h"
- #include "Floppy.h"
- #include "FileTypes.h"
- #include <Files.h>
-
- /*
- * File system interface
- */
-
- enum fsmode {Write, Read, Directory};
-
- struct fs_buffer_info {
- short fnum; /* FILE *fd */
- FSSpec direntry; /* DIR *dp */
- enum fsmode mode;
- byte buf[70];
- int buflen;
- byte *bufp;
- int eof;
- } fs_info[2];
-
- byte write_fs(unsigned char data, int secondary)
- {
- long len;
-
- if (fs_info[secondary].mode != Write) return kFloppyError;
-
- if (fs_info[secondary].fd==1)
- {
- len=1; FSWrite(fs_info[secondary].fnum, &len, &data);
- if (len==1) return kSerialOK;
- else return kFloppyError;
- };
-
- return kFloppyError;
- }
-
-
- int petconv(int c)
- {
- switch (c & 0xe0)
- {
- case 0x40:
- case 0x60:
- return (c ^ 0x20);
- }
- return (c);
- }
-
- void petconvstring(char *c)
- {
- int i;
- for (i = strlen(c) - 1; i >= 0; i--)
- c[i] = petconv(c[i]);
- }
-
- byte read_fs(unsigned char *data, int secondary)
- {
- int i;
- unsigned short blocks;
- struct fs_buffer_info *info = &fs_info[secondary];
- long len;
- char name[256];
-
- switch (info -> mode)
- {
- case Write:
- return kFloppyError;
-
- case Read:
- if (info -> fd)
- {
- len=1; err=FSRead(fs_info[secondary].fnum, &len, data);
- if (err==noErr) return kSerialOK;
- else if (err==eofErr) return kSerialEOF;
- else return kFloppyError;
- }
- break;
-
- case Directory:
- if (info -> buflen <= 0)
- {
- myCPB.ioNamePtr=name;
- myCPB.ioVRefNum=0;
- myCPB.ioFDirIndex=info->index;
- myCPB.ioDirID=0;
- err=PBGetCatInfo(&myCPB, false);
- if (err==noErr)
- {
- ptr=info->buf; ch=0;
- *p++=1; ch++;
- *p++=4; ch++;
-
- blocks=myCPB.ioFlLgLen / 256L;
- *p++=blocks&256; ch++;
- *p++=(blocks>>8)&256; ch++;
-
- for (j = 0; blocks > 9; j++) blocks /= 10;
- i = 4 - j;
- if (i < 0) i=0;
- while (i-- > 0) { *p++ = ' '; ch++; }
-
- *p++ = '"'; ch++;
- for (i = 0; i < name[0]; i++) { *p++ = petconv([i+1]); ch++; }
- *p++ = '"'; ch++;
- *p++ = '\0'; ch++;
-
- info -> buflen = ch;
- }
- else
- {
- info -> buf[0] = 0;
- info -> buf[1] = 0;
- info -> buf[2] = 0;
- info -> buflen = 3;
- info -> eof++;
- }
- info -> bufp = info -> buf;
- }
- *data = *info -> bufp++;
- info -> buflen--;
- return kSerialOK;
- }
-
- return kFloppyError;
- }
-
-
-
- byte open_fs(char *name, int length, int secondary)
- {
- FILE *fd;
- DIR *dp;
- char tmp[256], *p;
-
- if (fs_info[secondary].fd) return kFloppyError;
-
- /*
- * Support only load / save
- */
- if (secondary < 0 || secondary >= 2) return kFloppyError;
-
- memcpy(tmp, name, length);
- tmp[length] = 0;
- petconvstring(tmp);
-
- if (*tmp == '$') {
- if (secondary != 0)
- return kFloppyError;
-
- if (tmp[1]) {
- if (!(dp = opendir((char *)tmp + 1))) {
- for (p = tmp; *p; p++)
- if (isupper(*p))
- *p = tolower(*p);
- if (!(dp = opendir((char *)tmp + 1)))
- return kFloppyError;
- }
- strcpy(fs_info[secondary].dir, tmp + 1);
- } else {
- if (!(dp = opendir(".")))
- return kFloppyError;
- strcpy(fs_info[secondary].dir, ".");
- }
-
- fs_info[secondary].mode = Directory;
- fs_info[secondary].dp = dp;
- fs_info[secondary].eof = 0;
- fs_info[secondary].buflen = 2;
- fs_info[secondary].bufp = fs_info[secondary].buf;
- fs_info[secondary].buf[0] = 0;
- fs_info[secondary].buf[1] = 4;
-
- } else {
- fs_info[secondary].mode = (secondary == 1 ? Write : Read);
- fd = fopen(tmp, fs_info[secondary].mode ? "r" : "w+");
-
- if (!fd) {
- for (p = tmp; *p; p++)
- if (isupper(*p))
- *p = tolower(*p);
-
- fd = fopen(tmp, fs_info[secondary].mode ? "r" : "w+");
-
- if (!fd)
- return kFloppyError;
- }
- fs_info[secondary].fd = fd;
- }
- return kSerialOK;
- }
-
-
-
- byte close_fs(int secondary)
- {
- switch (fs_info[secondary].mode) {
- case Write:
- case Read:
- if (!fs_info[secondary].fd)
- return FLOPPY_ERROR;
-
- fclose(fs_info[secondary].fd);
- fs_info[secondary].fd = NULL;
- break;
-
- case Directory:
- if (!fs_info[secondary].dp)
- return FLOPPY_ERROR;
-
- closedir(fs_info[secondary].dp);
- fs_info[secondary].dp = NULL;
- break;
- }
-
- return FLOPPY_COMMAND_OK;
- }
-
- HFileInfo myCPB;
- char fname[256];
- short totalFiles, totalDirs;
-
- main()
-
- myCPB.ioNamePtr=(unsigned char *)fname;
- myCPB.ioVRefNum=0;
- EnumCatalog(fsRtDirID);
-
-
- EnumCatalog(long searchId)
- {
- short index=1;
- OSErr err;
-
- do
- {
- myCPB.ioDFirIndex=index;
- myCPB.ioDirID=dirIdToSearch;
- err=PBGetCatInfo(&myCPB, false);
-
- if (err=noErr)
- {
- if (((myCPB.ioFlAttrib>>4)&0x01)==1)
- {
- dir
- }
- else
- {
- print name;
- }
- index++;
- }
- } while (err!=fnfErr);
- }
-